package com.littlecorgi.leave.student;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.BitmapImageViewTarget;
import com.bumptech.glide.request.target.ImageViewTarget;
import com.littlecorgi.leave.R;
import com.luck.picture.lib.engine.ImageEngine;
import com.luck.picture.lib.listener.OnImageCompleteCallback;
import com.luck.picture.lib.tools.MediaUtils;
import com.luck.picture.lib.widget.longimage.ImageSource;
import com.luck.picture.lib.widget.longimage.ImageViewState;
import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView;

/**
 * Created by Android Studio. ProjectName: ----2、图片选择器加载图片失败GlideEngine： Author: HongYu (wb_hongyu3@staff.weibo.com)
 * Create date: by Baron on 2020/11/24 11:24 AM Last modified by YanTao (wb_hongyu3@staff.weibo.com) Last modified date:
 * by Baron on 2020/11/24 11:24 AM \ -------------------------------------------- \| The only thing that is constant is
 * change! | \ -------------------------------------------- \ \ \ \ \_\_ _/_/ \ \ \__/ \ (oo)\_______ \ (__)\ )\/\ \
 * ||----w | \ || ||
 */
public class GlideEngine implements ImageEngine {

    /**
     * 加载图片
     *
     * @param context   上下文
     * @param url       链接URL
     * @param imageView 加载图片的ImageView
     */
    @Override
    public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
        Glide.with(context).load(url).into(imageView);
    }

    /**
     * 加载网络图片适配长图方案 # 注意：此方法只有加载网络图片才会回调
     *
     * @param context       上下文
     * @param url           链接URL
     * @param imageView     加载图片的ImageView
     * @param longImageView 长图的ImageView
     * @param callback      网络图片加载回调监听 {link after version 2.5.1 Please use the #OnImageCompleteCallback#}
     */
    @Override
    public void loadImage(
            @NonNull Context context,
            @NonNull String url,
            @NonNull ImageView imageView,
            SubsamplingScaleImageView longImageView,
            OnImageCompleteCallback callback) {
        Glide.with(context)
                .asBitmap()
                .load(url)
                .into(
                        new ImageViewTarget<Bitmap>(imageView) {
                            @Override
                            public void onLoadStarted(@Nullable Drawable placeholder) {
                                super.onLoadStarted(placeholder);
                                if (callback != null) {
                                    callback.onShowLoading();
                                }
                            }

                            @Override
                            public void onLoadFailed(@Nullable Drawable errorDrawable) {
                                super.onLoadFailed(errorDrawable);
                                if (callback != null) {
                                    callback.onHideLoading();
                                }
                            }

                            @Override
                            protected void setResource(@Nullable Bitmap resource) {
                                if (callback != null) {
                                    callback.onHideLoading();
                                }
                                if (resource != null) {
                                    boolean eqLongImage =
                                            MediaUtils.isLongImg(resource.getWidth(),
                                                    resource.getHeight());
                                    longImageView
                                            .setVisibility(eqLongImage ? View.VISIBLE : View.GONE);
                                    imageView.setVisibility(eqLongImage ? View.GONE : View.VISIBLE);
                                    if (eqLongImage) {
                                        // 加载长图
                                        longImageView.setQuickScaleEnabled(true);
                                        longImageView.setZoomEnabled(true);
                                        longImageView.setPanEnabled(true);
                                        longImageView.setDoubleTapZoomDuration(100);
                                        longImageView.setMinimumScaleType(
                                                SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
                                        longImageView.setDoubleTapZoomDpi(
                                                SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
                                        longImageView.setImage(
                                                ImageSource.bitmap(resource),
                                                new ImageViewState(0, new PointF(0, 0), 0));
                                    } else {
                                        // 普通图片
                                        imageView.setImageBitmap(resource);
                                    }
                                }
                            }
                        });
    }

    /**
     * 加载网络图片适配长图方案 # 注意：此方法只有加载网络图片才会回调
     *
     * @param context       上下文
     * @param url           链接
     * @param imageView     加载图片的ImageView
     * @param longImageView @ 已废弃
     */
    @Override
    public void loadImage(
            @NonNull Context context,
            @NonNull String url,
            @NonNull ImageView imageView,
            SubsamplingScaleImageView longImageView) {
        Glide.with(context)
                .asBitmap()
                .load(url)
                .into(
                        new ImageViewTarget<Bitmap>(imageView) {
                            @Override
                            protected void setResource(@Nullable Bitmap resource) {
                                if (resource != null) {
                                    boolean eqLongImage =
                                            MediaUtils.isLongImg(resource.getWidth(),
                                                    resource.getHeight());
                                    longImageView
                                            .setVisibility(eqLongImage ? View.VISIBLE : View.GONE);
                                    imageView.setVisibility(eqLongImage ? View.GONE : View.VISIBLE);
                                    if (eqLongImage) {
                                        // 加载长图
                                        longImageView.setQuickScaleEnabled(true);
                                        longImageView.setZoomEnabled(true);
                                        longImageView.setPanEnabled(true);
                                        longImageView.setDoubleTapZoomDuration(100);
                                        longImageView.setMinimumScaleType(
                                                SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
                                        longImageView.setDoubleTapZoomDpi(
                                                SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
                                        longImageView.setImage(
                                                ImageSource.bitmap(resource),
                                                new ImageViewState(0, new PointF(0, 0), 0));
                                    } else {
                                        // 普通图片
                                        imageView.setImageBitmap(resource);
                                    }
                                }
                            }
                        });
    }

    /**
     * 加载相册目录
     *
     * @param context   上下文
     * @param url       图片路径
     * @param imageView 承载图片ImageView
     */
    @Override
    public void loadFolderImage(
            @NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
        Glide.with(context)
                .asBitmap()
                .load(url)
                .apply(new RequestOptions().placeholder(R.drawable.picture_image_placeholder))
                .into(
                        new BitmapImageViewTarget(imageView) {
                            @Override
                            protected void setResource(Bitmap resource) {
                                RoundedBitmapDrawable circularBitmapDrawable =
                                        RoundedBitmapDrawableFactory
                                                .create(context.getResources(), resource);
                                circularBitmapDrawable.setCornerRadius(8);
                                imageView.setImageDrawable(circularBitmapDrawable);
                            }
                        });
    }

    /**
     * 加载gif
     *
     * @param context   上下文
     * @param url       图片路径
     * @param imageView 承载图片ImageView
     */
    @Override
    public void loadAsGifImage(
            @NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
        Glide.with(context).asGif().load(url).into(imageView);
    }

    /**
     * 加载图片列表图片
     *
     * @param context   上下文
     * @param url       图片路径
     * @param imageView 承载图片ImageView
     */
    @Override
    public void loadGridImage(
            @NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
        Glide.with(context)
                .load(url)
                .apply(new RequestOptions().placeholder(R.drawable.picture_image_placeholder))
                .into(imageView);
    }

    private GlideEngine() {
    }

    private static GlideEngine instance;

    /**
     * 返回GlideEngine的单例对象
     *
     * @return GlideEngine的单例对象
     */
    public static GlideEngine createGlideEngine() {
        if (null == instance) {
            synchronized (GlideEngine.class) {
                if (null == instance) {
                    instance = new GlideEngine();
                }
            }
        }
        return instance;
    }
}
